﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//写一个代码，判断机器是大端还是小端？
//int main()
//{
//	int a = 1;//0X00 00 00 01
//	char* p = (char*)&a;
//	if (*p == 1)
//		printf("小端");//01 00 00 00
//	else
//		printf("大端");//00 00 00 01
//
//	return 0;
//}

//int main()
//{
//	int a = 1;//0X00 00 00 01
//	
//	if (*(char*)&a == 1)
//		printf("小端");//01 00 00 00
//	else
//		printf("大端");//00 00 00 01
//
//	return 0;
//}

//int check_sys()
//{
//	int a = 1;
//	//1.取出a的地址
//	//2.强制类型转换为char*后解引用，取出a的第一个字节的数据
//	//3.如果取出的是1，就是小端，取出的0是大端
//	return *(char*)&a;
//}
//int main()
//{
//	int ret = check_sys;
//	if (1 == ret)
//		printf("小端\n");
//	else
//		printf("大端\n");
//
//	return 0;
//}


//#include<stddef.h>
////宏
////offsetof - 计算结构体成员相对于起始位置的偏移量
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//	int h;
//};
////#pragma - 预处理指令
//#pragma pack(1)
////修改默认对齐数
//struct S2
//{
//	char c1;
//	int i;
//	char c2;
//	int h;
//};
//#pragma pack()
//
//int main()
//{
//	printf("%zd\n", sizeof(struct S1));
//	printf("%zd\n", sizeof(struct S2));
//
//	printf("%zd\n", offsetof(struct S1, c1));
//	printf("%zd\n", offsetof(struct S1, i));
//	printf("%zd\n", offsetof(struct S1, c2));
//	printf("%zd\n", offsetof(struct S1, h));
//
//	return 0;
//}

//结构体传参
//函数传参 选择print2
//函数传参的时候，参数时需要压栈的，会有时间和空间上的系统开销
//struct S1
//{
//	int data[1000];
//	int num;
//};
//void print1(struct S1 t)
//{
//	printf("%d %d\n", t.data[0], t.num);
//}
//void print2(const struct S1* ps)
//{
//	printf("%d %d\n", ps->data[1], ps->num);
//}
//int main()
//{
//	struct S1 s = { {1,2,3,4,5},40 };
//	print1(s);
//	print2(&s);
//	return 0;
//}


//基于结构体
//结构体实现 位段
//有跨平台问题
//int ,unsigned int ,signed int ,char
//struct S1
//{
//	char c1 : 3;
//	char c2 : 4;
//	char c3 : 5;
//	char c4 : 4;
//};
//int main()
//{
//	//struct S1 s = { 0 };
//	//s.c1 = 10;
//	//s.c2 = 12;
//	//s.c3 = 3;
//	//s.c4 = 4;
//	//printf("%zd\n", sizeof(struct S1));//3
//
//	struct S1 sa = { 0 };
//	//注意：赋值
//	//scanf("%d\n", &sa.c1);//erro
//	
//	int b = 0;
//	scanf("%d\n", &b);
//	sa.c2 = b;
//
//	return 0;
//}


//联合体
//union u
//{
//	char c;
//	int u;
//};
//union U
//{
//	char c[5];
//	int i;
//};
//int main()
//{
//	union u uu;
//	union U a;
//	printf("%zd\n", sizeof(uu));//4
//	printf("%zd\n", sizeof(a));//8//存在对齐规则
//
//	//三个地址相同
//	printf("%p\n", &uu);
//	printf("%p\n", &(uu.c));
//	printf("%p\n", &(uu.u));
//	return 0;
//}

//例子
//typedef struct S
//{
//	char c1;
//	char c2;
//	char c3;
//	char c4;
//}S;
//typedef union U
//{
//	int n;
//	S s;
//}U;
//int main()
//{
//	U u = { 0 };
//	u.n = 0x11223344;
//	printf("%x %x %x %x\n", u.s.c1, u.s.c2, u.s.c3, u.s.c4);//44 33 22 11
//	return 0;
//}

//使⽤联合体是可以节省空间的，举例：
//⽐如，我们要搞⼀个活动，要上线⼀个礼品兑换单，礼品兑换单中有三种商品：图书、杯⼦、衬衫。
//每⼀种商品都有：库存量、价格、商品类型和商品类型相关的其他信息。
//图书：书名、作者、⻚数
//杯⼦：设计
//衬衫：设计、可选颜⾊、可选尺⼨
//typedef struct
//{
//	char title[20];//书名
//	char author[20];//作者
//	int num_pages;//⻚数
//}book;
//typedef struct 
//{
//	char design[30];//设计
//}mug;
//typedef struct
//{
//	char design[30];//设计
//	int colors;//颜⾊
//	int sizes;//尺⼨
//}shirt;
//typedef union
//{
//	book b;
//	mug m;
//	shirt s;
//}item;
//struct gift_list
//{
//	int stock_number;//库存量
//	double price; //定价
//	int item_type;//商品类型
//	item i;
//};

//写一个代码，判断机器是大端还是小端？
//int check_sys()
//{
//	union
//	{
//		int a;
//		char b;
//	}u;
//	u.a = 1;
//	return u.b;
//}
//int main()
//{
//	int ret = check_sys;
//	if (1 == ret)
//		printf("小端\n");
//	else
//		printf("大端\n");
//
//	return 0;
//}

//枚举
//enum Day//星期
//{
//	//这里可取的值是常量，也叫枚举常量
//	Mon,//0
//	Tues,
//	Wed,
//	Thur,
//	Fri,
//	Sat,
//	Sun
//};
//enum Sex//性别
//{
//	MALE=2,//也可以赋值
//	FEMALE,//3
//	SECRET
//};
//typedef enum Color//颜⾊
//{
//	RED,
//	GREEN,
//	BLUE
//}Color;
//int main()
//{
//	printf("%d\n", Mon);
//	printf("%d\n", Wed);
//	printf("%d\n", FEMALE);
//	printf("%d\n", RED);
//
//	enum Sex s = MALE;
//	Color c = RED;
//	return 0;
//}




